﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetExtensions.Core.Helpers
{
    public class JsonObjectInvoker : TypeInvoker
    {
        public string Data { get; set; }

        public JsonObjectInvoker()
        {

        }

        public JsonObjectInvoker(TypeInvoker invoker)
        {
            this.Module = invoker.Module;
            this.Clazz = invoker.Clazz;
        }
        public JsonObjectInvoker(Type type) : base(type)
        {

        }
        public JsonObjectInvoker(Type type, object data) : base(type)
        {
            this.Data = JsonConvert.SerializeObject(data);
        }

        public object New()
        {
            Type type = TypeHelper.TryParse(Module, Clazz);
            return JsonConvert.DeserializeObject(Data, type);
        }
        public string ToJson()
        {
            return JsonConvert.SerializeObject(this);
        }

        public static JsonObjectInvoker Parse(object data)
        {
            if (data == null) return null;
            if (TypeHelper.IsBasicType(data.GetType())) return null;

            JsonObjectInvoker invoker = new JsonObjectInvoker(TypeHelper.TryParse(data.GetType()));
            invoker.Data = JsonConvert.SerializeObject(data);
            return invoker;
        }

        public static object From(string data)
        {
            if (data == null) return null;
            var invoker = JsonConvert.DeserializeObject<JsonObjectInvoker>(data);
            return invoker.New();
        }
    }
}
